package com.aura.lyngen.ai;

import com.aura.lyngen.ai.model.HtmlCodeResult;
import com.aura.lyngen.ai.model.MultiFileCodeResult;
import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.TokenStream;
import dev.langchain4j.service.UserMessage;
import reactor.core.publisher.Flux;

/*
 * 不需要自己写实现类
 * AiServices 会在运行时基于接口动态生成代理实现，
 * 它会自动处理提示词注入、消息构造、调用大模型 API、以及同步/流式结果映射，
 * 所以接口定义就是规范，代理就是实现，你只管调用即可。
 */

/**
 * @ClassName AiCodeGeneratorService
 * @Description AI代码生成服务接口
 * @Author ZJX
 * @Date 2025/8/29 23:27
 * @Version 1.0
 **/
public interface AiCodeGeneratorService {

    /**
     * 根据用户提示生成代码  - 生成 HTML文件代码
     *
     * @param userPrompt 用户提示词
     * @return AI的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    HtmlCodeResult generateHtmlCode(String userPrompt);


    /**
     * 根据用户提示生成代码  - 生成多文件代码
     *
     * @param userPrompt 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    MultiFileCodeResult generateMultiFileCode(String userPrompt);


    /**
     * 根据用户提示生成代码  - 生成 HTML文件代码 - SSE流
     *
     * @param userPrompt 用户提示词
     * @return AI的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-html-system-prompt.txt")
    Flux<String> generateHtmlCodeStream(String userPrompt);


    /**
     * 根据用户提示生成代码  - 生成多文件代码 - SSE流
     *
     * @param userPrompt 用户提示词
     * @return AI 的输出结果
     */
    @SystemMessage(fromResource = "prompt/codegen-multi-file-system-prompt.txt")
    Flux<String> generateMultiFileCodeStream(String userPrompt);


    /**
     * 生成 Vue 项目代码（流式）
     *
     * @param userMessage 用户消息
     * @return 生成过程的流式响应
     */
    @SystemMessage(fromResource = "prompt/codegen-vue-project-system-prompt.txt")
    TokenStream generateVueProjectCodeStream(@MemoryId long appId, @UserMessage String userMessage);
}
